﻿using AntdUI; // UI库 https://gitee.com/AntdUI/AntdUI
using AutoScaleHelper; // 自动缩放库 https://github.com/hlz2516/AutoScaleHelper
using Microsoft.Win32;
using System;
using System.CodeDom;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Diagnostics.Eventing.Reader;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Resources;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
using ToolTip = System.Windows.Forms.ToolTip;

namespace MMD_Morph_NoteHelp
{
    // ============== 
    //      主窗口
    // ===============
    public partial class MainForm : AntdUI.Window
    {
        AutoScale autoScale = new AutoScale(); // 自动缩放实例
        private bool isTopMost = true; // 窗体置顶状态
        private ToolTip toolTip1 = new ToolTip(); // 悬停提示实例
        private IniHelper ini = new IniHelper("config\\settings.ini");  // 配置文件实例
        private bool isResizing = false; // 是否正在调整大小
        private bool isMoving = false; // 是否正在移动
        private ControlMonitorService monitorService; // 控件监视服务实例
        private PresetForm presetFormInstance; // 表情预设窗口实例

        // 链接语言资源文件
        private ResourceManager resManager = new ResourceManager("MMD_Morph_NoteHelp.LanguageList.Resource", typeof(MainForm).Assembly);

        public static event Action LanguageChanged; // 语言改变事件
        // 触发语言变更事件的方法
        public void OnLanguageChanged()
        {
            LanguageChanged?.Invoke();
            ApplyLocalization(); // 刷新主窗体控件
        }

        // ---------------------
        //  主函数
        // ---------------------
        public MainForm()
        {
            InitializeComponent();

            //this.Mode = AntdUI.TAMode.Light; // 亮色主题
            this.StartPosition = FormStartPosition.CenterScreen; // 主窗体居中显示

            // 订阅语言变更事件
            LanguageManager.OnLanguageChanged += UpdateLanguage;

            // 记录初始大小
            // this.MinimumSize = this.Size;

            // 初始化自动缩放
            autoScale.AutoFont = true;
            autoScale.SetContainer(this);// 以当前窗体为容器

            // 窗体自动置顶
            this.TopMost = isTopMost;
            if (isTopMost)
            {
                // 置顶状态：蓝色背景，白色文字
                TOPWIN.DefaultBack = Color.Blue;
                TOPWIN.ForeColor = Color.White;
            }
            else
            {
                // 未置顶状态：默认背景，默认文字色
                TOPWIN.DefaultBack = Color.White;
                TOPWIN.ForeColor = Color.Black;
            }

            monitorService = new ControlMonitorService(this);

            // 按窗口标题部分匹配（例如 MMD 窗口的标题里包含 "MikuMikuDance"）
            monitorService.TargetWindowTitle = "MikuMikuDance";
            //monitorService.TargetProcessName = "MikuMikuDance.exe"; // 或者按进程名（例如MikuMikuDance.exe）
            monitorService.StartMonitoring();

            // 主题变更事件
            ThemeManager.OnThemeChanged += ApplyThemeColors;
        }

        // 语言更新方法：重新绑定当前窗口所有控件资源
        private void UpdateLanguage()
        {
            ApplyLocalization(); // 复用现有方法，确保所有控件文字更新
            //monitorService?.TriggerUpdate(); // 通知监控服务立即用新语言刷新数据
        }

        // -------------------
        // 窗体加载时初始化
        // -------------------
        private void MainForm_Load(object sender, EventArgs e)
        {
            //this.MinimumSize = this.Size; // 设置最小化大小为初始大小

            // 按钮悬停提示文字
            toolTip1.SetToolTip(TOPWIN, "点击切换窗口置顶状态");
            toolTip1.SetToolTip(Settingicon, "打开设置");
            toolTip1.SetToolTip(Saveoutput, "保存输出");
            //toolTip1.SetToolTip(ExitWin, "退出程序");

            // 注释内容设置滚动条
            NoteContent.Multiline = true; // 多行
            NoteContent.ScrollBars = ScrollBars.Vertical; // 只显示垂直滚动条
            // NoteContent.ScrollBars = ScrollBars.Horizontal; // 只显示水平滚动条
            // 或 ScrollBars.Both 显示水平和垂直滚动条

            // 在程序启动或窗口加载时调用
            LoadConfig();

            // 读取配置文件
            string lang = ini.Read("Window", "Language", "en"); // 语言
            LanguageManager.SetLanguage(lang); // 通过全局管理器设置初始语言
            string TopOpen = ini.Read("Window", "TopOpen", "false"); // 置顶
            string fontFamily = ini.Read("Font", "FontFmaily", ""); // 字体名称
            float fontSize = float.TryParse(ini.Read("Font", "FontSize", ""), out float fs) ? fs : 9f; // 字体大小
            string fontColor = ini.Read("Font", "FontColor", "#000000"); // 字体颜色
            int fontAlpha = int.TryParse(ini.Read("Font", "FontOpacity", "255"), out int fa) ? fa : 255; // 字体透明度
            bool isDark = ini.Read("Window", "IsDark", "false") == "true"; // 是否深色主题
            string backColor = ini.Read("Window", "BackColor", "#FFFFFF"); // 背景颜色
            string opacityStr = ini.Read("Window", "Opacity", "100"); // 透明度
            string widthStr = ini.Read("Window", "WindowWidth", "360"); // 窗口宽度
            string heightStr = ini.Read("Window", "WindowHeight", "130"); // 窗口高度

            // 订阅窗口事件
            this.LocationChanged += MainForm_LocationChanged;
            this.SizeChanged += MainForm_SizeChanged;
            this.ResizeBegin += MainForm_ResizeBegin;
            this.ResizeEnd += MainForm_ResizeEnd;
            this.Move += MainForm_Move;

            // 测试 IniHelper
            try
            {
                IniHelper testIni = new IniHelper("config\\settings.ini");
                string testValue = testIni.Read("Window", "Language", "not_found");
                Debug.WriteLine($"测试读取配置: Language = {testValue}");
            }
            catch (Exception ex)
            {
                Debug.WriteLine($"测试 IniHelper 失败: {ex.Message}");
            }

            // 开始监控
            monitorService.StartMonitoring();

            // 测试：立即显示调试信息
            //monitorService.DebugInfo();
        }

        // 窗口开始调整大小
        private void MainForm_ResizeBegin(object sender, EventArgs e)
        {
            isResizing = true;
        }

        // 窗口调整大小结束
        private void MainForm_ResizeEnd(object sender, EventArgs e)
        {
            isResizing = false;
            SaveWindowState();
        }

        // 窗口开始移动
        private void MainForm_Move(object sender, EventArgs e)
        {
            isMoving = true;
        }

        // 窗口位置改变
        private void MainForm_LocationChanged(object sender, EventArgs e)
        {
            if (isMoving)
            {
                isMoving = false;
                SaveWindowState();
            }
        }

        // 窗口大小改变时保存配置
        private void MainForm_SizeChanged(object sender, EventArgs e)
        {
            if (!isResizing && this.WindowState == FormWindowState.Normal)
            {
                SaveWindowState();
            }
        }

        // 保存窗口状态（位置和大小）
        private void SaveWindowState()
        {
            if (this.WindowState == FormWindowState.Normal)
            {
                ini.Write("Window", "WindowX", this.Location.X.ToString()); // 坐标值X
                ini.Write("Window", "WindowY", this.Location.Y.ToString()); // 坐标值Y
                ini.Write("Window", "WindowWidth", this.Width.ToString()); // 宽度
                ini.Write("Window", "WindowHeight", this.Height.ToString()); // 高度
            }
        }

        // 实现配置加载
        private void LoadConfig()
        {
            // 恢复窗口位置和大小
            if (int.TryParse(ini.Read("Window", "WindowX", "-1"), out int x) &&
                int.TryParse(ini.Read("Window", "WindowY", "-1"), out int y) &&
                int.TryParse(ini.Read("Window", "WindowWidth", "360"), out int w) &&
                int.TryParse(ini.Read("Window", "WindowHeight", "130"), out int h))
            {
                // 检查位置是否在屏幕内
                if (x >= 0 && y >= 0 && IsLocationOnScreen(x, y))
                {
                    this.Location = new Point(x, y);
                }
                else
                {
                    this.StartPosition = FormStartPosition.CenterScreen;
                }

                // 设置窗口大小，确保不小于最小大小
                this.Size = new Size(Math.Max(w, this.MinimumSize.Width), Math.Max(h, this.MinimumSize.Height));
            }

            // 窗口置顶
            bool topOpen = ini.Read("Window", "TopOpen", "false") == "true";
            this.TopMost = topOpen;
            UpdateTopMostStyle(topOpen); // 单独提取样式更新方法

            // 背景色
            string colorStr = ini.Read("Window", "BackColor", "#FFFFFF");
            this.BackColor = ColorTranslator.FromHtml(colorStr);

            // 透明度
            if (double.TryParse(ini.Read("Window", "Opacity", "100"), out double opacity))
                this.Opacity = opacity / 100.0;

            // 语言
            string lang = ini.Read("Window", "Language", "en");
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
            ApplyLocalization(); // 应用语言

            // 字体
            string fontFamily = ini.Read("Font", "FontFmaily", "");
            float fontSize = float.TryParse(ini.Read("Font", "FontSize", "9"), out float fs) ? fs : 9f;
            if (!string.IsNullOrEmpty(fontFamily))
            {
                this.Font = new Font(fontFamily, fontSize);
                // 同步子控件字体
                ChoiceDisplay.Font = this.Font; // 当前选择
                ValueSize.Font = this.Font; // 数值
                NoteContent.Font = this.Font; // 注释内容
            }

            // 字体颜色和透明度
            string fontColor = ini.Read("Font", "FontColor", "#000000");
            Color color = ColorTranslator.FromHtml(fontColor);
            int fontAlpha = int.TryParse(ini.Read("Font", "FontOpacity", "255"), out int fa) ? fa : 255;
            this.ForeColor = Color.FromArgb(fontAlpha, color.R, color.G, color.B);
            // 同步子控件颜色
            ChoiceDisplay.ForeColor = this.ForeColor; // 当前选择
            ValueSize.ForeColor = this.ForeColor; // 数值
            NoteContent.ForeColor = this.ForeColor; // 注释内容

            // 深色主题
            bool isDark = ini.Read("Window", "IsDark", "false") == "true";
            ThemeManager.SetTheme(isDark);
        }

        // 检查位置是否在屏幕内
        private bool IsLocationOnScreen(int x, int y)
        {
            foreach (Screen screen in Screen.AllScreens)
            {
                if (screen.WorkingArea.Contains(x, y))
                    return true;
            }
            return false;
        }

        // 配置保存
        public void SaveConfig()
        {
            // 保存窗口状态
            SaveWindowState();

            ini.Write("Window", "TopOpen", this.TopMost ? "true" : "false"); // 置顶
            ini.Write("Window", "BackColor", ColorTranslator.ToHtml(this.BackColor)); // 背景色
            ini.Write("Window", "Opacity", ((int)(this.Opacity * 100)).ToString()); // 透明度
            ini.Write("Window", "Language", Thread.CurrentThread.CurrentUICulture.Name); // 语言
            ini.Write("Window", "IsDark", AntdUI.Config.IsDark.ToString().ToLower()); // 深色主题
            ini.Write("Font", "FontFmaily", this.Font.FontFamily.Name); // 字体名称
            ini.Write("Font", "FontSize", this.Font.Size.ToString()); // 字体大小
            ini.Write("Font", "FontColor", ColorTranslator.ToHtml(this.ForeColor)); // 字体颜色
            ini.Write("Font", "FontOpacity", this.ForeColor.A.ToString()); // 字体透明度
        }

        // 窗口关闭时保存最终状态
        protected override void OnFormClosing(FormClosingEventArgs e)
        {
            SaveWindowState(); // 确保关闭前保存
            monitorService?.Dispose(); // 清理监控服务 ===
            // monitorService?.StopMonitoring(); // Dispose会调用Stop,
            base.OnFormClosing(e);
        }

        // 窗口关闭时取消订阅
        protected override void OnClosed(EventArgs e)
        {
            this.LocationChanged -= MainForm_LocationChanged;
            this.SizeChanged -= MainForm_SizeChanged;
            this.ResizeBegin -= MainForm_ResizeBegin;
            this.ResizeEnd -= MainForm_ResizeEnd;
            this.Move -= MainForm_Move;

            LanguageManager.OnLanguageChanged -= UpdateLanguage; // 取消订阅语言变更事件
            ThemeManager.OnThemeChanged -= ApplyThemeColors; // 取消订阅主题变更事件
            base.OnClosed(e);
        }

        // 实现窗口鼠标拖动
        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);
            if (e.Button == MouseButtons.Left)
            {
                this.DraggableMouseDown();
            }
        }

        // 当前选择显示
        private void ChoiceDisplay_TextChanged(object sender, EventArgs e)
        {

        }

        // 数值
        private void ValueSize_TextChanged_1(object sender, EventArgs e)
        {

        }


        // 置顶按钮
        private void TOPWIN_Click(object sender, EventArgs e)
        {
            isTopMost = !isTopMost;
            this.TopMost = isTopMost;
            if (isTopMost)
            {
                // 置顶状态：蓝色背景，白色文字
                TOPWIN.DefaultBack = Color.Blue;
                TOPWIN.ForeColor = Color.White;
            }
            else
            {
                // 未置顶状态：默认背景，默认文字色
                TOPWIN.DefaultBack = Color.White;
                TOPWIN.ForeColor = Color.Black;
            }
            SaveConfig(); // 保存配置
            //ini.Write("Window", "TopOpen", isTopMost ? "true" : "false"); // 写入置顶配置
        }

        // 设置按钮
        private void Settingicon_Click(object sender, EventArgs e)
        {
            var optionWin = new OptionWin(this);
            optionWin.StartPosition = FormStartPosition.CenterParent; // 居中显示
            optionWin.ShowDialog(this); // 模拟弹窗，在主窗体上层显示
            ApplyLocalization();
        }

        // 应用语言资源到控件
        public void ApplyLocalization()
        {
            this.Text = resManager.GetString("MainForm_Title", Thread.CurrentThread.CurrentUICulture); // 窗口标题
            toolTip1.SetToolTip(TOPWIN, resManager.GetString("TOPWIN_ToolTip", Thread.CurrentThread.CurrentUICulture)); // 置顶提示文字
            toolTip1.SetToolTip(Settingicon, resManager.GetString("Settingicon_ToolTip", Thread.CurrentThread.CurrentUICulture)); // 设置提示文字
            toolTip1.SetToolTip(Saveoutput, resManager.GetString("Saveoutput_ToolTip", Thread.CurrentThread.CurrentUICulture)); // 保存提示文字
            //toolTip1.SetToolTip(ExitWin, resManager.GetString("ExitWin_ToolTip", Thread.CurrentThread.CurrentUICulture)); // 退出提示文字
        }

        // 保存按钮
        private async void Saveoutput_Click(object sender, EventArgs e)
        {
            // 弹出确认对话框
            if (// 提示：即将要保存输出 txt 和 vmd 文件\n请确认当前是否在第0帧，程序会自动注册全部表情帧。\n确定要保存导出吗？
                MessageBox.Show(L10n.Get("AllpyOKMessage"), L10n.Get("AllpyOK"),
                MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
                {
                // 用户点击确定后的操作
                // 1. 从监控服务获取当前的数据包
                MorphData dataToSave = monitorService?.GetCurrentMorphData();

                // 2. 检查数据是否有效
                if (dataToSave == null || string.IsNullOrEmpty(dataToSave.ModelName))
                {
                    // MessageBox.Show("未能获取到 MMD 窗口或模型数据，请确保 MMD 正在运行且已加载模型。", "保存失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    MessageBox.Show(L10n.Get("Error_MMDNotFound_Body"), L10n.Get("Error_MMDNotFound_Title"), MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }

                if (dataToSave.Morphs.Count == 0)
                {
                    // MessageBox.Show("没有可保存的表情数据。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    MessageBox.Show(L10n.Get("Info_NoDataToSave_Body"), L10n.Get("Info_NoDataToSave_Title"), MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }

                // 3. 准备文件对话框
                using (var fbd = new System.Windows.Forms.FolderBrowserDialog())
                {
                    //saveDialog.Filter = L10n.Get("PresetForm_SaveDialog_Filter"); // 所有文件 (*.*)|*.*
                    //saveDialog.Title = L10n.Get("PresetForm_SaveDialog_Title"); // 保存表情数据
                    //saveDialog.FileName = $"{dataToSave.ModelName}_morphs"; // 默认文件名，不带后缀

                    fbd.Description = L10n.Get("FolderSaveDialogTip"); // 描述，请选择保存.txt和.vmd文件的文件夹
                    fbd.SelectedPath = Path.Combine(Application.StartupPath, "Presets"); // 默认打开预设文件夹

                    // 4. 显示对话框
                    if (fbd.ShowDialog(this) == DialogResult.OK)
                    {
                        string folderPath = fbd.SelectedPath;

                        // === 自动生成带有时间印记和序列号的文件名 ===
                        string baseName = $"{dataToSave.ModelName}_morphs_{DateTime.Now:yyyyMMdd}";
                        int sequence = 1;
                        string txtFilePath;
                        string vmdFilePath;

                        // 检查序号是否重复
                        while (true)
                        {
                            txtFilePath = Path.Combine(folderPath, $"{baseName}_{sequence:D3}.txt");
                            vmdFilePath = Path.Combine(folderPath, $"{baseName}_{sequence:D3}.vmd");
                            if (!File.Exists(txtFilePath) && !File.Exists(vmdFilePath))
                            {
                                break; // 找到了！
                            }
                            sequence++;
                        }

                        // === 第一步：保存.txt文件 ===
                        try
                        {
                            // 5. 构建txt文本内容
                            var contentBuilder = new StringBuilder();
                            contentBuilder.AppendLine($"name: {dataToSave.ModelName}");
                            contentBuilder.AppendLine("Morph:");
                            foreach (var morph in dataToSave.Morphs)
                            {
                                contentBuilder.AppendLine($"{morph.Key}: {morph.Value}");
                            }
                            File.WriteAllText(txtFilePath, contentBuilder.ToString(), Encoding.UTF8);
                        }
                        catch (Exception ex)
                        {
                            // MessageBox.Show($"保存文件时发生错误：\n{ex.Message}", "保存失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            MessageBox.Show(this, L10n.Get("Error_SaveFailed_Body", $".txt File: {ex.Message}"), L10n.Get("Error_SaveFailed_Title"), MessageBoxButtons.OK, MessageBoxIcon.Error);
                            return; // txt失败了，就不继续了
                        }

                        // === 第二步：保存.vmd文件 ===
                        string suggestedFileName = Path.GetFileName(vmdFilePath);
                        // 调用导出VMD的AHK脚本
                        await Win32Helper.ExportVMDWithAHK(vmdFilePath);
                    }
                }
            }
        }

        // 表情预设按钮
        private void PresetButton_Click(object sender, EventArgs e)
        {
            // 检查实例是否存在或已销毁
            if (presetFormInstance == null || presetFormInstance.IsDisposed)
            {
                presetFormInstance = new PresetForm(monitorService);
            }

            presetFormInstance.ShowDialog(this); // 模拟弹窗，在主窗体上层显示
        }

        // 退出按钮 ExitWin
        // 已删除控件
        private void ExitWin_Click(object sender, EventArgs e)
        {
            Application.Exit(); // 退出应用程序
        }

        // 注释内容
        private void NoteContent_TextChanged(object sender, EventArgs e)
        {

        }

        // 提取置顶样式更新方法
        private void UpdateTopMostStyle(bool isTop)
        {
            TOPWIN.DefaultBack = isTop ? Color.Blue : Color.White;
            TOPWIN.ForeColor = isTop ? Color.White : Color.Black;
        }

        // 应用主题颜色
        public void ApplyThemeColors(bool isDark)
        {
            if (isDark) // 深色主题
            {
                this.BackColor = Color.FromArgb(48, 48, 48); // 窗口背景
                this.MainHeader.BackColor = Color.FromArgb(48, 48, 48); // 标题栏背景
                this.MainHeader.ForeColor = Color.White; // 标题栏文字
                this.NoteContent.BackColor = Color.FromArgb(48, 48, 48); // 注释内容背景
                this.ChoiceDisplay.BackColor = Color.FromArgb(48, 48, 48); // 当前选择背景
                this.ValueSize.BackColor = Color.FromArgb(48, 48, 48); // 数值背景
                this.NoteContent.ForeColor = Color.White; // 注释内容文字
                this.ChoiceDisplay.ForeColor = Color.White; // 当前选择文字
                this.ValueSize.ForeColor = Color.White; // 数值文字
                this.TOPWIN.BackColor = Color.FromArgb(64, 64, 64); // 置顶按钮背景
                this.Saveoutput.BackColor = Color.FromArgb(64, 64, 64); // 保存按钮背景
                this.Settingicon.BackColor = Color.FromArgb(64, 64, 64); // 设置按钮背景
                //this.ExitWin.BackColor = Color.FromArgb(64, 64, 64); // 退出按钮背景
            }
            else // 亮色主题
            {
                this.BackColor = SystemColors.Control; // 窗口背景
                this.MainHeader.BackColor = SystemColors.Control; // 标题栏背景
                this.MainHeader.ForeColor = SystemColors.WindowText; // 标题栏文字
                this.NoteContent.BackColor = SystemColors.Control; // 注释内容背景
                this.ChoiceDisplay.BackColor = SystemColors.Window; // 当前选择背景
                this.ValueSize.BackColor = SystemColors.Window; // 数值背景
                this.NoteContent.ForeColor = SystemColors.WindowText; // 注释内容文字
                this.ChoiceDisplay.ForeColor = SystemColors.WindowText; // 当前选择文字
                this.ValueSize.ForeColor = SystemColors.WindowText; // 数值文字
                this.TOPWIN.BackColor = SystemColors.Control; // 置顶按钮背景
                this.Saveoutput.BackColor = SystemColors.Control; // 保存按钮背景
                this.Settingicon.BackColor = SystemColors.Control; // 设置按钮背景
                //this.ExitWin.BackColor = SystemColors.Control; // 退出按钮背景
            }
            this.Refresh();
        }


        // =========== END ===========
    }
}
